//package com.example.start.sm;
//
//import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
//import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
//import org.bouncycastle.crypto.params.ECPublicKeyParameters;
//import org.bouncycastle.math.ec.ECPoint;
//
//import java.io.IOException;
//import java.math.BigInteger;
//import java.nio.charset.StandardCharsets;
//import java.util.HashMap;
//import java.util.Map;
//
//public class SM2Utils {
//
//    public static String secretKey = "6D3705A1222CC9B59B6EA4B4775F092CB2D9F80BE52EC29C39D236BB39C0795C";
//    public static String publicKey = "04794A62D92C86907D4D407EE3D7672678825AD0A523F31CF250C9B657BC109AD5A696CBC515895A0F66050DEED93CBC9252E6C898926A2F1834B006CC3C7F9879";
//
//    //生成随机秘钥对
//    public static Map<String, String> generateKeyPair() {
//        Map<String, String> dataMap = new HashMap<>();
//        SM2 sm2 = SM2.Instance();
//        AsymmetricCipherKeyPair key = sm2.ecc_key_pair_generator.generateKeyPair();
//        ECPrivateKeyParameters ecpriv = (ECPrivateKeyParameters) key.getPrivate();
//        ECPublicKeyParameters ecpub = (ECPublicKeyParameters) key.getPublic();
//        BigInteger privateKey = ecpriv.getD();
//        ECPoint publicKey = ecpub.getQ();
//        dataMap.put("publicKey", Util.byteToHex(publicKey.getEncoded()));
//        dataMap.put("secretKey", Util.byteToHex(privateKey.toByteArray()));
//        return dataMap;
//    }
//
//
//    public static String encryptData(String pubk, String sourceData) {
//        try {
//            return new String(SM2Utils.encrypt(Util.hexToByte(pubk), sourceData.getBytes(StandardCharsets.UTF_8)).getBytes(), "UTF-8");
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return "";
//    }
//
//    //数据加密
//    private static String encrypt(byte[] publicKey, byte[] data) throws IOException {
//        if (publicKey == null || publicKey.length == 0) {
//            return null;
//        }
//
//        if (data == null || data.length == 0) {
//            return null;
//        }
//
//        byte[] source = new byte[data.length];
//        System.arraycopy(data, 0, source, 0, data.length);
//
//        Cipher cipher = new Cipher();
//        SM2 sm2 = SM2.Instance();
//        ECPoint userKey = sm2.ecc_curve.decodePoint(publicKey);
//
//        ECPoint c1 = cipher.Init_enc(sm2, userKey);
//        cipher.Encrypt(source);
//        byte[] c3 = new byte[32];
//        cipher.Dofinal(c3);
//
//        //C1 C2 C3拼装成加密字串
//        return Util.byteToHex(c1.getEncoded()) + Util.byteToHex(source) + Util.byteToHex(c3);
//
//    }
//
//
//    public static byte[] decryptData(String privateKey, String encryptedData) throws IOException {
//        return SM2Utils.decrypt(Util.hexToByte(privateKey), Util.hexToByte(encryptedData));
//    }
//
//    //数据解密
//    private static byte[] decrypt(byte[] privateKey, byte[] encryptedData) throws IOException {
//        if (privateKey == null || privateKey.length == 0) {
//            return null;
//        }
//
//        if (encryptedData == null || encryptedData.length == 0) {
//            return null;
//        }
//        //加密字节数组转换为十六进制的字符串 长度变为encryptedData.length * 2
//        String data = Util.byteToHex(encryptedData);
//        /***分解加密字串
//         * （C1 = C1标志位2位 + C1实体部分128位 = 130）
//         * （C3 = C3实体部分64位  = 64）
//         * （C2 = encryptedData.length * 2 - C1长度  - C2长度）
//         */
//        byte[] c1Bytes = Util.hexToByte(data.substring(0, 130));
//        int c2Len = encryptedData.length - 97;
//        byte[] c2 = Util.hexToByte(data.substring(130, 130 + 2 * c2Len));
//        byte[] c3 = Util.hexToByte(data.substring(130 + 2 * c2Len, 194 + 2 * c2Len));
//
//        SM2 sm2 = SM2.Instance();
//        BigInteger userD = new BigInteger(1, privateKey);
//
//        //通过C1实体字节来生成ECPoint
//        ECPoint c1 = sm2.ecc_curve.decodePoint(c1Bytes);
//        Cipher cipher = new Cipher();
//        cipher.Init_dec(userD, c1);
//        cipher.Decrypt(c2);
//        cipher.Dofinal(c3);
//
//        //返回解密结果
//        return c2;
//    }
//}